               [ Target: tElock 0.9x by tE! ]

 pH#3 .............F.u.l.l..R.e.v.e.r.s.e............. [    #Sadrzaj    ]
 0x01 ................................................ [ Intro          ]
 0x02 ................................................ [ Tools of trade ]
 0x03 ................................................ [ Unpacking 1    ]
 0x04 ................................................ [ Unpacking 2    ]
 0x05 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[     Intro     ]

  Novi  pH, nove teme. Idalje se bavimo reversingom (bar ja ;) a ovaj put
cemo uraditi nesto jako zanimljivo. Odradicemo odpakivanje tELocka na dva
razlicita nacina, na dve razlicite mete. Moram da priznam da ovaj tekst i
nije  bio  moja  ideja ali cu se zahvatili deroku sto me je zamolio da mu
obajsnim  kako se odpakuje tELock. I vi cete imati neke koristi od ovoga,
bar se ja tako nadam :)
  Prvi deo teksta se odnosi na jednostavno odpakivanje, dok cemo u drugom
odpakovati  metu  i rucno popraviti importe... Zvuci li interesantno? Ok,
onda obratite paznju:

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

  Da bi smo "popravili" ovaj crackme, trebace nam neki "vaspitni" alati:

 [+] OllyDBG v.1.10 .................................. http://www.wasm.ru
 [+] OllyInisible v.x ................................ http://www.wasm.ru
 [+] LordPE v.1.4 .................................... http://www.wasm.ru
 [+] ImpRec v.1.6 .................................... http://www.wasm.ru
 [+] PeID v0.93 ...................................... http://www.wasm.ru

  i naravno mete:

 [+] tElock 0.98b1 ....................................... my.target1.zip
 [+] tElock 0.96   ....................................... my.target2.zip

  Svi  ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate,  podhitno  ih  nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!                                                                 

--[ 0x03 ]---------------------------------------------[   Unpacking 1  ]

  Pre  nego  sto  pocnemo  sa  odpakivanjem  pomocu  Ollya moracemo da ga
podesimo  tako  da  stignemo  do  OEPa najbrze sto mozemo (bice to sa tri
klika ;). Dakle otvorite Olly i idite u meni Debugging options (ALT + O),
selektujte tab Exceptions i selektujte samo sledece checkboxove:         

 - Ignore memory access violations in Kernel32
 - INT3 breaks
 - Single-step break
 - Integer devision by 0

  Zasto  ovo  radimo?  Jednostavno  tELock ce nam "bacati" ove exceptione
pokusavajuci  da  detektuje  da  li  je  debugger aktivan. Pored ovoga je
potrebno da imate ukljucen OllyInvisible ili HideOlly plugin.
  Kada  ovo  uradimo,  mozemo  da  starujemo  nasu metu pomocu Ollya i da
pocnemo  sa  odpakivanjem.  Prve  linije koje se nalaze na OEPu izgledaju
ovako:

00407BD6 > $^\E9 25E4FFFF   JMP CrackMe1.00406000
00407BDB      00            DB 00
00407BDC      00            DB 00
00407BDD      00            DB 00
00407BDE      A8            DB A8
00407BDF      02            DB 02
00407BE0      D6            DB D6

  Postoji  vise  nacina  na koje mozemo doci do samog OEPa ali mi cemo to
uraditi  na  najbrzi  moguci  nacin.  Pritisnite  F9 kao da pokusavate da
startujete program, ali cete umesto startovanja programa zavrsiti ovde:

004066A8      8D            DB 8D
004066A9      C0            DB C0
004066AA      74            DB 74

  Posto Olly nije stigao da analizira ovaj kod, pritisnite CTRL + A da bi
ste videli sta se stvarno nalazi ovde:

004066A8   ?  8DC0          LEA EAX,EAX        ;  Illegal use of register
004066AA      74            DB 74              ;  CHAR 't'
004066AB      03            DB 03
004066AC   .  CD 20         INT 20
004066AE   >  64:67:8F06 00>POP DWORD PTR FS:[0]

 Kao sto vidite LEA EAX,EAX je ilegalna komanda i zato Olly ne zna sta da
uradi  ovde. Da bi smo presli preko ove komande potrebno je da pritisnemo
SHIFT + F9 posle cega cemo doci ovde:

00406BA6      CD            DB CD
00406BA7      68            DB 68              ;  CHAR 'h'
00406BA8      66            DB 66              ;  CHAR 'f'
00406BA9      05            DB 05

 Posto je ovo access vilation greska i ovde cemo pritisnuti SHIFT + F9 da
bi  smo  ponovo pokusali da startujemo program, ali cemo kao i prosli put
zavrsiti na LEA EAX, EAX komandi ovde:

004076F1   ?  8DC0          LEA EAX,EAX        ;  Illegal use of register
004076F3   ?  EB 01         JMP SHORT CrackMe1.004076F6

  Ako  sledeci  put pritisnemo SHIFT + F9 program ce se startovati! Posto
ovo  znamo (mozete to i da proverite) mozemo da postavimo jedan memoriski
break-point na glavnu sekciju kako bi smo presreli izvrsenje koda koji se
nalazi u glavnoj sekciji. Samim presretanjem cemo se naci na OEPu.
  Oticemo  u  Memory window (ALT + M) i postavicemo Memory break-point on
access  na  glavnu .code sekciju. Posle pritiska na SHIFT + F9 (da bi smo
presli preko LEA EAX,EAX) komande nacicemo se ovde:

0040104C      68            DB 68              ;  CHAR 'h'
0040104D      481F4000      DD CrackMe1.00401F48
00401051      E8            DB E8
00401052      EE            DB EE
00401053      FF            DB FF
00401054      FF            DB FF
00401055      FF            DB FF
00401056      00            DB 00
00401057      00            DB 00
00401058      00            DB 00
00401059      00            DB 00
0040105A      00            DB 00
0040105B      00            DB 00
0040105C      30            DB 30              ;  CHAR '0'
0040105D      00            DB 00
0040105E      00004000      DD CrackMe1.00400000
00401062      00            DB 00

  Da li je ovo pravi OEP? Pritisnite CTRL + A da bi ste analizirali kod i
videcete sledece:

0040104C   > /68 481F4000   PUSH CrackMe1.00401F48
00401051   . |E8 EEFFFFFF   CALL CrackMe1.00401044
00401056   . |0000          ADD BYTE PTR DS:[EAX],AL
00401058   . |0000          ADD BYTE PTR DS:[EAX],AL
0040105A   . |0000          ADD BYTE PTR DS:[EAX],AL

  I  kao  sto  je  bilo i za ocekivati adresa 0040104C je pravi OEP. Ovde
mozemo uraditi dump i popravku importa.
  Dump:  Otvorite  LordPE  i  selektujte proces koji trenutno debugujete.
Selektujte CrackMe10.exe i uradite full dump desnim dugmetom.
  Impoti: Ostavljajuci Olly otvoren i ne pomeracuji se sa adrese 0040104C
startujte ImpRec i u listi procesa ponovo selektujte CrackMe10.exe. Posle
ovoga potrebno je da ispunite sledece polje. U OEP polje unesite 0040104C
-  00400000 = 104C i pritisnite IAT AutoSearch i Get Imports dugme. Posto
su  svi pronadjeni importi validni mozemo da popravimo predhodno dumpovan
fajl  pomocu  LordPEa.  Pritisnite  Fix  dump i selektujte snimljeni fajl
posle cega ce tELock 0.98b1 biti uspesno odpakiovan!

--[ 0x04 ]---------------------------------------------[   Unpacking 2  ]

  Posto  smo vec konfigurisali Olly kako treba i posto smo u proslom delu
ovog  teksta vec naucili kako se dolazi do OEPa, to mozemo da iskoristimo
i  ovde.  Otvoricemo Olly i nasu drugu metu pomocu njega. Bez neke velike
mudrosti dolazimo do OEPa na adresi 00401000 i tu cemo uraditi dump.
 Sam OEP izgleda ovako:

00401000   > /68 E5314000   PUSH decryptm.004031E5 
00401005   . |68 73314000   PUSH decryptm.00403173 
0040100A   . |68 23314000   PUSH decryptm.00403123 
0040100F   . |68 D3304000   PUSH decryptm.004030D3 

  Mozemo  da pokusamo da popravimo importe pomocu ImpReca ali cemo umesto
validnih  importa  pronaci 5 importa koje ImpRec ne moze da prepozna. Ove
importe  cemo  popraviti  tako  sto cemo snimiti ovo drvo pomocu klika na
Save  Tree  dugme. Kada snimimo ovaj fajl otvoricemo ga pomocu notepada i
videcemo sledece:

Target: decryptme1.tElock0.96.exe
OEP: 00001000	IATRVA: 00002000	IATSize: 00000014

FThunk: 00002000	NbFunc: 00000005
0	00002000	?	0000	009E0000
0	00002004	?	0000	009E001D
0	00002008	?	0000	009E003A
0	0000200C	?	0000	00850000
0	00002010	?	0000	0085001D

  Sada  cemo  traceovati  kroz nasu metu pomocu Ollya. Interesuju nas svi
CALLovi ka API funkcijama. Dakle ucicemo u sledeci CALL sa F7:

00401028   .  E8 23060000   CALL decryptm.00401650

 I nacicemo se ovde:

00401650   $- FF25 10204000 JMP NEAR DWORD PTR DS:[402010] <- Ovde smo
00401656   $- FF25 0C204000 JMP NEAR DWORD PTR DS:[40200C]
0040165C   $- FF25 04204000 JMP NEAR DWORD PTR DS:[402004]
00401662   $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000]

  Kao  sto  vidimo  ovaj  niz  skokova  je lista skokova ka API pozivima,
odnosno ka njihovoj regirekciji. Sada moramo da povezemo svaku ovu adresu
sa  jednim  APIjem. Ovo cemo uraditi tako sto cemo pratiti svaki ovaj JMP
skok sa F7. U prvom slucaju cemo se posle klika na F7 naci ovde: 

0085001D    F9              STC
0085001E    72 01           JB SHORT 00850021
00850020    0C EB           OR AL,0EB
00850022    02B8 663D8000   ADD BH,BYTE PTR DS:[EAX+803D66]
00850028    FF20            JMP NEAR DWORD PTR DS:[EAX]
0085002A    B8 D64AA000     MOV EAX,0A04AD6
0085002F    F8              CLC
00850030  ^ 72 EB           JB SHORT 0085001D
00850032    B8 46008500     MOV EAX,850046
00850037    FF20            JMP NEAR DWORD PTR DS:[EAX]
00850039    90              NOP
0085003A    B8 20000000     MOV EAX,20
0085003F    0000            ADD BYTE PTR DS:[EAX],AL
00850041    0076 64         ADD BYTE PTR DS:[ESI+64],DH
00850044    D6              SALC
00850045  ^ 77 E3           JA SHORT 0085002A
00850047    A6              CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
00850048    D4 77           AAM 77

  Sada nam ostaje da ispratimo ovaj kod za redirekciju sa F8. Tokom ovoga
cemo naici na sledece:

00850037  - FF20            JMP NEAR DWORD PTR DS:[EAX];user32.wsprintfA

 Kada vratimo iz ovog skoka ka user32.wsprintfA APIu nacicemo se ovde:

0040102D   .  83C4 20       ADD ESP,20
00401030   .  68 36324000   PUSH decryptm.00403236
00401035   .  E8 28060000   CALL decryptm.00401662

 Ucicemo i u sledeci CALL sa F7 i nacicemo se ovde:

00401662   $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000]

  Ponovnim  pritiskom  na  F7 dolazimo opet do API redirekcije. Ovde cemo
ponoviti  sve sto smo radili i prilikom pronalaska wsprintf APIa samo sto
cemo ovaj put pronaci sledece:                                           

009E001A  - FF20            JMP NEAR DWORD PTR DS:[EAX];kernel32.lstrlenA

 Posle izlaska iz kernel32.dll fajla nacicemo se ovde:

0040103A   .  33FF          XOR EDI,EDI
0040103C   >  3BC7          CMP EAX,EDI

 Sada cemo traziti kroz kod sve dok ne dodjemo do nekog sledeceg CALLa ka
nekoj API funkciji. To ce se desiti ovde:

00401635   .  6A 40         PUSH 40
00401637   .  68 00304000   PUSH decryptm.00403000
0040163C   .  68 36324000   PUSH decryptm.00403236
00401641   .  6A 00         PUSH 0
00401643   .  E8 0E000000   CALL decryptm.00401656

  Ovde  cemo ponovo biti prinudjeni da udjemo u taj CALL sa F7 i docicemo
ovde:

00401656   $- FF25 0C204000 JMP NEAR DWORD PTR DS:[40200C]

 Klikom na F7 i analizom koda zakljucujemo da je ovo skok ka APIu:

0085001A  - FF20            JMP NEAR DWORD PTR DS:[EAX];user32.MessageBoxA

  Posle  izvrsenja ovog CALLa ka MessageBoxA API i naravno posle njegovog
zatvaranja i vracanja iz kernel32.dll fajla nacicemo se ovde: 

00401648   .  6A 00         PUSH 0
0040164A   .  E8 0D000000   CALL decryptm.0040165C

  Naravno  i  ovo  je  poziv  ka  nekom APIu. Na isti nacin kao i do sada
dolazimo do zakljucka da se radi o:

0040165C   $- FF25 04204000 JMP NEAR DWORD PTR DS:[402004]
...
009E0037  - FF20            JMP NEAR DWORD PTR DS:[EAX];kernel32.ExitProcess

 kernel32.ExitProcess APIu.

  Sada  imamo  sve  podatke  koji  su nam potrebni za rekreiranje IAT.txt
fajla.    Njegova    struktura  je  jedinstvena  i  potrebna  je  podpuna
modifikacija do sada snimljenog fajla u sledecu strukturu:

Target: decryptme1.tElock0.96.exe
OEP: 00001000	IATRVA: 00002000	IATSize: 00000014

FThunk: 00002000	NbFunc: 00000002
1	00002000	kernel32.dll	0000	lstrlenA
1	00002004	kernel32.dll	0000	ExitProcess

FThunk: 0000200C	NbFunc: 00000002
1	0000200C	user32.dll	0000	MessageBoxA
1	00002010	user32.dll	0000	wsprintfA

  Da  pojasnim. Prvi red se ispunjava tako sto za FThunk vrednost stavlja
poziv ka prvom APIu iz nekog .dll fajla. Posto smo mi odlucili da to bude
00002000 (RVA 00402000) onda taj API mora odgovarati APIju koji se dobija
skokom  sa  JMP  NEAR  DWORD  PTR  DS:[402000],  to  jest mora odgovarati
lstrlenA  APIu u kernel32.dll fajlu. Ali ovo je vec sadrzaj drugog reda u
kojem  postoje dve konstante. Jedan na pocetku reda i 0000 koje se odnose
na  ordinalni  broj  importa, ali ovaj broj cemo podesiti pomocu ImpReca.
Ovo  treba  ponoviti  za  sve  .dll  fajlove koje nasa meta ponavlja. Vec
uradjena IAT struktura se nalazi u istoj arhivi kao i nasa meta.
  Kada  konacno  konacno  snimite  ovaj fajl otvorite ga pomocu Load Tree
opcije  u  ImpRecu  i duplim klikom na svaki od ovih importa cete konacno
poraviti  sve ordinale. Kada konacno i ovo zavrsite mocete da uradite Fix
dump i da vidite da je i tELock 0.96 uspesno odpakovan.
  Jednostavno, zar ne :)

--[ 0x05 ]---------------------------------------------[ Outro & Greetz ]

  To  bi  bilo  to  sto  se tice tELocka. Njegovo otpakivanje i nije neki
problem... Jedino sto nas moze zadrzati malo duze je ispravka importa ali
kao sto smo videli ni to nije komplikovano. Sve u svemu vi ste dobili jos
jedan lep tekst o reversingu, a Deroko je dobio odgovor na pitanje: "Kako
da otpakujem tELock?"...

Greetz:

 SeekNDestroy   |   TSRh   |   EMiNENCE   |   CoolPHat   |   ELUSIVE 
b4d_s3c70r | B0r0 | loco | Kostolomac | Virus Krew | Jezgra | BlackHat

--[ EOF ]----------------------------------------------[  made by Ap0x  ]